const schedule = require('node-schedule');
const moment = require('moment');
const dbSync = require('./dbSync');
const fs = require('fs');
const path = require('path');

// 日志目录
const LOG_DIR = path.join(__dirname, 'logs');

// 确保日志目录存在
if (!fs.existsSync(LOG_DIR)) {
    fs.mkdirSync(LOG_DIR, { recursive: true });
}

// 日志文件路径
function getLogFilePath() {
    const date = moment().format('YYYY-MM-DD');
    return path.join(LOG_DIR, `sync_${date}.log`);
}

// 写入日志
function writeLog(message) {
    const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
    const logMessage = `[${timestamp}] ${message}\n`;
    
    console.log(logMessage.trim());
    
    fs.appendFileSync(getLogFilePath(), logMessage);
}

// 获取前一天的日期
function getYesterday() {
    return moment().subtract(1, 'days').format('YYYY-MM-DD');
}

// 同步前一天的数据
async function syncYesterdayData() {
    const yesterday = getYesterday();
    return await syncCustomDateRange(yesterday, yesterday);
}

// 同步指定日期范围的数据
async function syncCustomDateRange(startDate, endDate) {
    writeLog(`开始同步 ${startDate} 至 ${endDate} 的数据...`);
    
    try {
        const result = await dbSync.syncAllData(startDate, endDate);
        
        if (result.success) {
            writeLog(`成功同步 ${startDate} 至 ${endDate} 的所有数据`);
            
            // 记录每个表的同步状态
            Object.entries(result.results).forEach(([table, tableResult]) => {
                if (tableResult.success) {
                    writeLog(`- ${table}: ${tableResult.message}`);
                } else {
                    writeLog(`- ${table}: 失败 - ${tableResult.error}`);
                }
            });
        } else {
            writeLog(`同步 ${startDate} 至 ${endDate} 的数据失败: ${result.error}`);
        }
        
        return result;
    } catch (error) {
        writeLog(`同步过程中发生错误: ${error.message}`);
        return { success: false, error: error.message };
    }
}

// 启动定时任务 - 每天凌晨1点执行
function startScheduler() {
    // 每天凌晨1点执行
    const job = schedule.scheduleJob('0 1 * * *', async () => {
        writeLog('定时任务启动 - 同步前一天数据');
        await syncYesterdayData();
        writeLog('定时任务完成');
    });
    
    writeLog('定时任务已启动，将在每天凌晨1点同步前一天的数据');
    
    return job;
}

// 立即执行一次同步前一天数据（可选，用于测试或手动触发）
async function syncNow() {
    writeLog('手动触发同步前一天数据');
    const result = await syncYesterdayData();
    writeLog('手动同步完成');
    return result;
}

// 同步指定日期的数据
async function syncDate(date) {
    writeLog(`手动触发同步指定日期 ${date} 的数据`);
    const result = await syncCustomDateRange(date, date);
    writeLog(`同步指定日期 ${date} 完成`);
    return result;
}

// 同步指定日期范围的数据
async function syncDateRange(startDate, endDate) {
    writeLog(`手动触发同步日期范围 ${startDate} 至 ${endDate} 的数据`);
    const result = await syncCustomDateRange(startDate, endDate);
    writeLog(`同步日期范围 ${startDate} 至 ${endDate} 完成`);
    return result;
}

// 同步当前月份数据
async function syncCurrentMonth() {
    const today = moment();
    const startOfMonth = today.clone().startOf('month').format('YYYY-MM-DD');
    const currentDate = today.format('YYYY-MM-DD');
    
    writeLog(`手动触发同步当前月份数据 (${startOfMonth} 至 ${currentDate})`);
    const result = await syncCustomDateRange(startOfMonth, currentDate);
    writeLog(`同步当前月份数据完成`);
    return result;
}

// 同步上一个月份数据
async function syncLastMonth() {
    const lastMonth = moment().subtract(1, 'month');
    const startOfMonth = lastMonth.clone().startOf('month').format('YYYY-MM-DD');
    const endOfMonth = lastMonth.clone().endOf('month').format('YYYY-MM-DD');
    
    writeLog(`手动触发同步上个月数据 (${startOfMonth} 至 ${endOfMonth})`);
    const result = await syncCustomDateRange(startOfMonth, endOfMonth);
    writeLog(`同步上个月数据完成`);
    return result;
}

// 导出模块
module.exports = {
    startScheduler,
    syncNow,
    syncYesterdayData,
    syncDate,
    syncDateRange,
    syncCurrentMonth,
    syncLastMonth,
    syncCustomDateRange
}; 